package com.zwh.se.number;

import java.math.BigDecimal;
import java.math.RoundingMode;

/**
 * @author yexi
 */
public class BigDecimalDemo {
    public static void main(String[] args) {
        System.out.println("----------普通的float和double计算会造成精度丢失----------");
        System.out.println(0.01 + 0.09);//0.09999999999999999
        System.out.println("----------要进行准确的计算，就需要使用BigDecimal---------");
        BigDecimal b1 = new BigDecimal("0.01");
        BigDecimal b2 = new BigDecimal("0.09");
        BigDecimal add = b1.add(b2);
        System.out.println(add);//0.10
        System.out.println("----------但注意，构建对象必须使用字符串---------");
        BigDecimal b3 = new BigDecimal(0.01);
        BigDecimal b4 = new BigDecimal(0.09);
        BigDecimal r = b3.add(b4);
        System.out.println(r);//0.09999999999999999687749774324174723005853593349456787109375

        System.out.println();
        System.out.println("----------↓下面是对BigDecimal的各种方法进行测试---------");
        BigDecimal b5 = new BigDecimal("3.1418");
        BigDecimal b6 = new BigDecimal("2");
        System.out.println("----------精度控制---------");
        //保留两位小数，四舍五入
        System.out.println(b5.setScale(2, RoundingMode.HALF_UP));//3.14
        System.out.println("----------乘法---------");
        System.out.println(b5.multiply(b6));//6.2836
        System.out.println("----------除法---------");
        System.out.println(b5.divide(b6));//1.5709
        System.out.println("----------除法有时会有除不尽的情况，就会发生异常---------");
        try {
            System.out.println(new BigDecimal("10").divide(new BigDecimal("3")));
        } catch (ArithmeticException e) {
            // java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
            System.out.println("\033[31;4m" + e + "\033[0m");
            // 因此除法一般都会要求保留多少位小数的规范
            System.out.println(new BigDecimal("10").divide(new BigDecimal("3"), 3, RoundingMode.HALF_UP));//3.333
        }
        System.out.println("----------比较---------");
        // -1, 0, or 1 代表着的是小于、等于和大于
        System.out.println(BigDecimal.valueOf(0.111).compareTo(BigDecimal.ONE));
        System.out.println(BigDecimal.valueOf(1.111).compareTo(BigDecimal.ONE));

        System.out.println();
        System.out.println("----------↓下面是对BigDecimal的一些特性进行说明---------");
        BigDecimal zero = new BigDecimal(0);
        System.out.println(zero.equals(0));//false,要记住BigDecimal初始化后的数字跟int的数字本质并不是一个对象
        //System.out.println(zero == 0);//甚至编译器也不会让你通过
        //如果必须要进行比较，需要这么做
        BigDecimal otherBigDecimal = BigDecimal.valueOf(000.0000);
        System.out.println(otherBigDecimal.compareTo(zero) == 0);//true，需要用到自带的compareTo进行比较后得出的int值才可以比较

    }
}
